
package controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import model.*;
import view.ProdutoGUI;

public class ProdutoCtrl implements IProdutoCtrl{
    
    private IProduto model;
    private ICategoria categoria;
    private IUnidade unidade;
    private IFornecedor fornecedor;
    
    private ProdutoGUI produtoGUI;
    

    public ProdutoCtrl(IProduto model) {
        this.model = model;  
        
        categoria = CategoriaModel.getInstance();
        fornecedor = FornecedorModel.getInstance();
        unidade = UnidadeModel.getInstance();             
        
        produtoGUI = new ProdutoGUI(model, this);
        categoria.registrarObserver(produtoGUI);
        fornecedor.registrarObserver(produtoGUI);
        unidade.registrarObserver(produtoGUI);
        produtoGUI.criarTela();        
    }
    
    private void setProduto(int codigo, String descricao, ICategoria categoria, IFornecedor fornecedor, IUnidade unidade,  
            double valorCompra, double valorVenda, int estoque, int estoqueCritico, String auditoria) {        
        
        model.setCodigo(codigo);
        model.setDescricao(descricao);        
        model.setFornecedor(fornecedor);        
        model.setUnidade(unidade);        
        model.setCategoria(categoria);
        model.setValorVenda(valorVenda);
        model.setValorCompra(valorCompra);
        model.setEstoque(estoque);
        model.setEstoqueCritico(estoqueCritico);
        model.setAuditoria(auditoria);
    }
    
    @Override
    public void inserir(int codigo, String descricao, int categoria, int fornecedor, int unidade,
            double valorCompra, double valorVenda, int estoque, int estoqueCritico, String auditoria){        
        
        this.fornecedor.setCodigo(fornecedor);
        this.categoria.setCodigo(categoria);
        this.unidade.setCodigo(unidade);
                
        setProduto(codigo, descricao, this.categoria, this.fornecedor, this.unidade, valorCompra, 
                valorVenda, estoque, estoqueCritico, auditoria);
        
        model.setProximoCodigo();
        model.inserir();    
    }
    
    @Override
    public void atualizar(int codigo, String descricao, int categoria, int fornecedor, int unidade, 
            double valorCompra, double valorVenda, int estoque, int estoqueCritico, String auditoria){        
        
        this.fornecedor.setCodigo(fornecedor);
        this.categoria.setCodigo(categoria);
        this.unidade.setCodigo(unidade);
        
        setProduto(codigo, descricao, this.categoria, this.fornecedor, this.unidade, valorCompra, 
                valorVenda, estoque, estoqueCritico, auditoria);
        
        model.atualizar();        
    }
            
    @Override
    public void excluir(int codigo){
        model.setCodigo(codigo);
        model.excluir();    
    }
    
    @Override
    public ArrayList pesquisar(int iOpcao, String iPesquisa) {
        ArrayList<IProduto> produtos = model.pesquisar(iOpcao, iPesquisa);
        ArrayList lstTemp = new ArrayList();
        IProduto produtoTemp;
        Iterator i = produtos.iterator();              
        while (i.hasNext()) {
            produtoTemp = (IProduto) i.next();                                             
            lstTemp.add(new String[]{String.valueOf(produtoTemp.getCodigo()), produtoTemp.getDescricao(),
                String.valueOf(produtoTemp.getValorCompra()), String.valueOf(produtoTemp.getValorVenda()), 
                String.valueOf(produtoTemp.getEstoque()), String.valueOf(produtoTemp.getEstoqueCritico()),
                String.valueOf(produtoTemp.getCategoria().getDescricao()),String.valueOf(produtoTemp.getUnidade().getDescricao()), 
                String.valueOf(produtoTemp.getFornecedor().getNome()),produtoTemp.getAuditoria()});
        }
        return lstTemp;
    }  
    
    @Override
    public int getCodigo() {
        return model.getCodigo();
    } 
    
    @Override
    public ArrayList getAll() {
        return pesquisar(IProduto.SQL_GETALL, "0");
    }

    @Override
    public ArrayList getAllFornecedor() {
        ArrayList<IFornecedor> fornecedores = fornecedor.getAll();
        ArrayList lstTemp = new ArrayList();
        IFornecedor fornecedorTemp;
        Iterator i = fornecedores.iterator();
        SimpleDateFormat formData = new SimpleDateFormat("dd/MM/yyyy");        
        while (i.hasNext()) {
            fornecedorTemp = (IFornecedor) i.next();                                             
            lstTemp.add(new String[]{String.valueOf(fornecedorTemp.getCodigo()), fornecedorTemp.getNome(),
                fornecedorTemp.getFone(),fornecedorTemp.getEmail(),fornecedorTemp.getCelular(),
                fornecedorTemp.getFax(),fornecedorTemp.getCnpj(),fornecedorTemp.getContato(),
                fornecedorTemp.getRg(),fornecedorTemp.getOrgaorg(),fornecedorTemp.getCpf(),
                fornecedorTemp.getEndereco(),fornecedorTemp.getBairro(),fornecedorTemp.getCidade(),
                fornecedorTemp.getUf(),fornecedorTemp.getCep(),formData.format(fornecedorTemp.getDataCadatro()),
                fornecedorTemp.getObs(),fornecedorTemp.getAuditoria()});       
        }
        return lstTemp;
    }

    @Override    
    public ArrayList getAllUnidade() {         
        ArrayList<IUnidade> unidades = unidade.getAll();
        ArrayList lstTemp = new ArrayList();
        IUnidade  unidadeTemp;
        Iterator i = unidades.iterator();
        while (i.hasNext()) {            
            unidadeTemp = (IUnidade) i.next();
            lstTemp.add(new String[]{String.valueOf(unidadeTemp.getCodigo()), unidadeTemp.getDescricao()});            
        }
        return lstTemp;
    }

    @Override
    public ArrayList getAllCategoria() {
        ArrayList<ICategoria> categorias = categoria.getAll();
        ArrayList lstTemp = new ArrayList();
        ICategoria categoriaTemp;
        Iterator i = categorias.iterator();
        while (i.hasNext()) {            
            categoriaTemp = (ICategoria) i.next();
            lstTemp.add(new String[]{String.valueOf(categoriaTemp.getCodigo()), categoriaTemp.getDescricao()});            
        }        
        return lstTemp;
    }  
    
}   

